#ifndef TDOA_H
#define TDOA_H

#include <QObject>
#include <QtCore/qglobal.h>
#include <QtCore/qmath.h>
#include <QtCore/QRandomGenerator>
#include <QtCore/QDateTime>

#include "constvariable.h"
#include "globalvariables.h"

using namespace std;

extern double xMAX;// 搜索变量范围
extern double xMIN;
extern double yMAX;
extern double yMIN;
extern double DistanceOfMachMH;//马赫数距离

class TDOA : public QObject
{
    Q_OBJECT
public:
    explicit TDOA(QObject *parent = nullptr);

    // CoordinateProcessing 接口函数.
    // data:获取到的源数据(uint16数据，基站数量个数据).
    // 返回值:x float32, y float32.
    QVector<double> CoordinateProcessing(const QVector<uint16_t>& data);

    // positionCalculate
    // @描述: 算法主程序
    // @参数:deltaT 时间差
    // @参数:A3 基站坐标
    // @参数:BestX X 最优解
    // @参数:BestY Y 最优解
    // @返回值:float64 返回值,预留
    double positionCalculate(QVector<int32_t> deltaT, QVector<QVector<double>> A3, double *BestX, double *BestY);

    // optimizationFunction
    // @描述: 解算方法
    // @参数:x 解算出的x
    // @参数:y 解算出的y
    // @参数:deltaT 时间差
    // @参数:A3 基站坐标
    // @返回值:float32 解算值
    double optimizationFunction(double x, double y, const QVector<int32_t>& deltaT, const QVector<QVector<double>>& A3);

    // judgeTimePoint
    // @描述:排除误差较大的时间差数据帧
    // @参数:differenceData
    // @返回值:bool
    bool judgeTimePoint(QVector<int32_t> differenceData);

    // compareData 溢出处理方法,判断数据是否溢出.如溢出,处理数据.
    int32_t compareData(uint16_t base, uint16_t another);

private:

    const double precision = 0.000001;
    const int16_t L = 50;//马尔可夫链长度，等温过程的迭代次数
    const double K = 0.8;//衰减参数
    const double S = 0.02;//步长因子



};

#endif // TDOA_H
